package tool

import (
	"fmt"
	"github.com/gomodule/redigo/redis"
	"time"
)

func NewRedis(url, password string, db int) (*redis.Pool, error) {

	if db < 0 || db > 15 {
		return nil, fmt.Errorf("the number of Redis databases exceeded the limit")
	}

	return &redis.Pool{
		MaxIdle:     2, //最大连接数
		IdleTimeout: 240 * time.Second,
		Dial: func() (conn redis.Conn, err error) { // 返回一个连接，在需要创建连接的时候调用
			c, err := redis.Dial("tcp", url)
			if err != nil {
				return nil, err
			}
			if password != "" { // 如果有连接密码
				if _, err := c.Do("AUTH", password); err != nil {
					_ = c.Close()
					return nil, err
				}
			}
			if _, err := c.Do("SELECT", db); err != nil { // 设置数据库操作数量
				_ = c.Close()
				return nil, err
			}
			return c, nil
		},
		TestOnBorrow: func(c redis.Conn, t time.Time) error { // 检查健康状态
			if time.Since(t) < time.Minute { // 如果连接时间小于一分钟，则不用ping redis服务器来
				return nil
			}
			_, err := c.Do("PING") // 超时ping 检查连接，如果出错就返回
			return err
		},
	}, nil
}
